package com.zq.多线程设计模式.Future设计模式.demo;

import java.util.concurrent.*;

/**
 * @author Jiu
 * @description：TODO
 * @date 2021/04/07   13:42
 **/
public class RealData1 implements Callable {

    private String str;

    public RealData1(String str) {
        this.str = str;
    }

    @Override
    public Object call() throws Exception {
        // 利用sleep方法来表示真是业务是非常缓慢的
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 10; i++) {
            sb.append(str);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }


    public static void main(String[] args) {
        FutureTask<String> future = new FutureTask<String>(new RealData1("liangyongxing"));
        ExecutorService executor = Executors.newFixedThreadPool(1);    // 使用线程池
        //执行FutureTask，相当于上例中的client.request("name")发送请求
        //在这里开启线程进行RealData的call()执行
        executor.submit(future);
        System.out.println("请求完毕");

        try {
            // 这里仍然可以做额外的数据操作，这里使用sleep代替其他业务逻辑的处理
            Thread.sleep(2000);

            /**
             * 相当于上例当中的 data.getResult()，取得call()方法的返回值
             * 如果此时call()方法没有执行完毕，则依然会等待
             */
            System.out.println("数据 = " + future.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        } finally {
            executor.shutdown();
        }
    }

}
